# U uvodnim poglavljima dotakli smo se grafickog prikaza numerickih podataka u programskom jeziku Julia.
# Funkcionalnosti kojih smo se tamo dotakli bili su samo osnovni deo vezan za vizuelizaciju podataka koji
# postoji u skoro svim programskim jezicima koji su numeričkog tipa. Međutim, ono šta je specifično za programski jezik
# Julia jeste njena izuzetno bogata podrška za grafičko prikazivanje podataka.
#Pre svega, potrebno je izvršiti instaliranje odgovarajućeg paketa za grafički prikaz podataka
import Pkg;
Pkg.add("Plots");
using Plots
#Za početak, nadogradićemo osnovne funkcionalnosti date u početnim lekcijama
#Obično crtanje jednog grafika funkcija mogle bi se realizovati na sledeći način:
t = 1 : 20;
y = t.*t;
plot(t,y, title = "function y = x^2")
#Međutim, šta ako bismo hteli da dodamo još nekakav grafik, npr y = x^4, ali tako da on ima širi domen ili drugačije
#vrednosti domena za koju bi se vršio prikaz podataka?
#U okviru programskog jezika Julia postoji operator ! kojim se na sledeći način može već iscrtanom grafiku dodati
#novi grafik za nekim novim svojstvima:
t2 = 1 : 30;
z = t2.^4;
plot!(t2,z, title = "functions y = x^4 and y = x^2")
#Na ovaj način bismo mogli da dodajemo grafik po grafik na isti plot ako to želimo, međutim ovo je veoma
#nepraktično i veoma često pogrešno.
#Ovu operaciju moguće je raditi i na sledeći način: Počećemo od nekog početnog plota koji želimo da iscrtamo i
#sačuvaćemo ga pod nekim imenom, a onda ćemo potom sa plot! (sa znakom izvika vršiti sukcesivno dodavanje novih grafika)
fig_iscrtaj = plot(t, y );
plot!(fig_iscrtaj, t2, z, title = "functions y = x^4 and y = x^2" );
fig_iscrtaj
# Ukoliko želimo da iscrtamo i više nekakvih funkcija koje imamo predefinisane ili samo ih sami definisali,
# možemo ih prvo upakovati u jedan niz koji se direktno prosleđuje plot() funkciji, a potom kasnije navesti argumente
# za koje ih iscrtavamo na grafiku
plot([sin,cos], 0, 4*π)
#Najjednostavniji način za crtanje jeste taj da funkciji plot() pošaljemo samo vrednosti funkcije. Ona će je
#iscrtati u pravom obliku, međutim neće voditi računa o horizontalnoj osi tj. daće iscrtavanje u celobrojnoj podeli te ose
#te se na taj način gubi informacija o argumentu, što može dovesti šfo pogrešnih zaključaka ukoliko nam apriorno
#nisu dostupne još neke informacije
t = 0 : 0.01 : 2;
m = t.*t;
plot(m)
#On nema informaciju da je crtanje izvršeno na intervalu od 0 do 2, pa će ovde izvršiti pogrešan prikaz podataka
#Izvršimo sada instalaciju još dva paketa koji su pogodni kako za vizuelizaciju podataka, tako i za njihovu
#statističku obradu kasnije
Pkg.add("StatsPlots");
Pkg.add("Distributions");
Pkg.add("RDatasets");
# Važno je upamtiti da Julia tretira prosleđene vektore kao serije. Dakle, ukoliko želimo da prosledimo nekakav
# vektor ili matricu, on će, ako je prosleđen vektor, taj vektor tretirati kao vremensku seriju, a ako je prosleđena
# matrica, onda će on izvršiti njeno particionisanje i posmatraće svaku njenu KOLONU kao vremensku seriju:
mat_15by10 = rand(15,10);
plot(mat_15by10)
#Takođe možemo izvršiti iscrtavanje poligona:
#To se vrši poyivom funkcije plot(), koja kao argument prima niz sa koordinatama poligona u obliku uredjenih parova.
#Važno je ponoviti u prosleđenom nizu početnu tačku i staviti je na kraj kako bi iscrtavanje bilo pravilno
x = [1 2 2 1 1]; y = [3 3 10 10 1];
plot([(1,3), (2,3), (2,10), (1, 10), (1,3)], title = "Pravougaonik")
#Julia ima kao jedan od svojih tipova podataka i tip podataka DataFrame - niz koji služi za smeštanje
#i rad sa tabelarnim podacima, a koji ima mnoge primene
#Njegova instalacija
Pkg.add("DataFrames");
using DataFrames, StatsPlots, RDatasets
#Moguće je, koristeći i gotove skupove podataka iz RDatasets (već gotove DataFrame-ove) i plotovati ih, sa različitim
#opcijama
iris = dataset("datasets", "iris")
@df iris scatter(
:SepalLength, #Ovde označavamo sa :Obeležje koja obeležja želimo da uzmemo za iscrtavanje
:SepalWidth, #To će ovde biti dužina i širina žaštitnog dela lista
group = :Species, #Ovo je opciona linija koja nam omogućava da izvučemo podatke za više različitih vrsta
bg = RGB(0.3, 0.1, 0.5) # bg - od background; prosleđivanje RGB intenziteta pozadine, skaliranih na interval od 0 do 1
) #Opciono, moguće je i definisanje oblika za iscrtavanje ovih promenljivih, uzimanje pojedinih vrsta itd...
# Za kraj, demonstriraćemo još da je moguće vršiti i iscrtavanje slika, kao jednu od funkcionalnosti:
using TestImages
sl1 = testimage("toucan.png");
plot(sl1)